#pragma once

#include <QObject>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include <QJsonObject>
#include <QJsonDocument>
#include <QDateTime>
#include <QMutex>
#include <QVariant>
#include <QMap>
#include <QStringList>

class DatabaseManager : public QObject
{
    Q_OBJECT

public:
    static DatabaseManager& instance();

    // 数据库连接管理
    bool connect(const QString& host, int port, const QString& database,
                 const QString& username, const QString& password,
                 const QString& connectionName = "DefaultConnection");
    void disconnect();
    bool isConnected() const;
    QString lastError() const;

    // 数据操作 - 手动指定JSON字段
    bool insertData(const QString& tableName, const QVariantMap& data, const QStringList& jsonFields = {});
    bool updateData(const QString& tableName, const QVariantMap& data, const QString& whereClause,
                    const QVariantMap& whereParams, const QStringList& jsonFields = {});
    bool deleteData(const QString& tableName, const QString& whereClause, const QVariantMap& whereParams);


    // 查询参数操作 特定使用
    QVariantMap selectCategory(const QString& category);

    // 查询操作 - 手动指定需要解析的JSON字段
    QVariantMap selectOne(const QString& tableName, const QStringList& columns = {"*"},
                          const QString& whereClause = "", const QVariantMap& whereParams = QVariantMap(),
                          const QStringList& jsonFieldsToParse = {});

    QList<QVariantMap> selectAll(const QString& tableName, const QStringList& columns = {"*"},
                                 const QString& whereClause = "", const QVariantMap& whereParams = QVariantMap(),
                                 const QStringList& jsonFieldsToParse = {});

    // 专门针对JSON字段的操作
    bool updateJsonField(const QString& tableName, const QString& jsonFieldName,
                         const QJsonObject& jsonData, const QString& whereClause,
                         const QVariantMap& whereParams);

    QJsonObject getJsonField(const QString& tableName, const QString& jsonFieldName,
                             const QString& whereClause, const QVariantMap& whereParams);

    // 批量操作
    bool executeTransaction(const std::function<bool()>& transactionOperations);
    bool batchInsert(const QString& tableName, const QList<QVariantMap>& dataList,
                     const QStringList& jsonFields = {});

    // 数据库操作 - 更新或插入（针对状态表）
    bool upsertData(const QString& tableName, const QVariantMap& data,
                    const QString& whereClause, const QVariantMap& whereParams,
                    const QStringList& jsonFields = {});

    // 替换插入（删除旧记录并插入新记录）
    bool replaceData(const QString& tableName, const QVariantMap& data,
                     const QStringList& jsonFields = {});

private:
    explicit DatabaseManager(QObject* parent = nullptr);
    ~DatabaseManager();

    QSqlDatabase m_database;
    mutable QRecursiveMutex m_mutex;
    QString m_connectionName;
    QString m_lastError;
    QVariantMap rowToMap(const QSqlQuery& query, const QStringList& jsonFieldsToParse = {});
    QVariant processValueForJson(const QVariant& value, bool isJsonField);
};

